4.4. Configuring the Classpath Scanning 配置 Classpath 扫描
Jersey 使用一个公共 Java 服务提供者获得所有服务实现机制。这意味着Jersey 扫描整个类路径找到适当的 META-INF/services/files 。classpath 中越多的 jar 或者 war扫描可能会耗费更多时间。在使用中,您需要保存应用程序引导每一毫秒的时间,通常可以禁用在 Jersey 查找服务提供者。
Jersey 验证的 SPIs 列表
- AutoDiscoverable (server, client) - 如果禁用加载服务,则 AutoDiscoverable 特性自动禁用
- ForcedAutoDiscoverable (server, client) - Jersey 看起来总是加载这些自动发现功能即使服务是禁用的
- HeaderDelegateProvider (server, client)
- ComponentProvider (server)
- ContainerProvider (server)
- AsyncContextDelegateProvider (server/Servlet)
附加的 Jersey 验证的 SPIs 列表,以防 metainf-services 模块在 classpath 中
- MessageBodyReader (server, client)
- MessageBodyWriter (server, client)
- ExceptionMapper (server, client)
因为可以配置所有SPI实现类或子类实例手动在您的应用程序,禁用服务在 Jersey 并不影响任何 Jersey 核心模块和扩展的功能,可以节省许多 在应用程序初始化期间,以换取更详细的应用程序配置代码。
服务查找在 Jersey(默认启用)可以通过一个 CommonProperties.METAINF_SERVICES_LOOKUP_DISABLE 属性来禁用。有一个客户端/服务器计数器部分,只有客户端或服务器上禁用该特性分别为:ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE/ServerProperties.METAINF_SERVICES_LOOKUP_DISABLE。在所有其他情况下,客户端/服务器特殊属性将会被所关联的共同属性所覆盖,当设置的时候。
例如,下面的代码片断禁用服务提供者查找和手动注册的实现不同的JAX-RS 和 Jersey 提供的类型(ContainerRequestFilter, Feature, ComponentProvider 和 ContainerProvider)
Example 4.3. 通过 ResourceConfig 注册 SPI 实现
ResourceConfig resourceConfig = new ResourceConfig(MyResource.class);
resourceConfig.register(org.glassfish.jersey.server.filter.UriConnegFilter.class);
resourceConfig.register(org.glassfish.jersey.server.validation.ValidationFeature.class);
resourceConfig.register(org.glassfish.jersey.server.spring.SpringComponentProvider.class);
resourceConfig.register(org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainerProvider.class);
resourceConfig.property(ServerProperties.METAINF_SERVICES_LOOKUP_DISABLE, true);
同样,在场景中的部署模型需要扩展应用程序的子类(如在所有的servlet容器部署),可以使用下面的代码来实现相同的应用程序配置:
public class MyApplication extends ResourceConfig {
public MyApplication() {
register(org.glassfish.jersey.server.filter.UriConnegFilter.class);
register(org.glassfish.jersey.server.validation.ValidationFeature.class);
register(org.glassfish.jersey.server.spring.SpringComponentProvider.class);
register(org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainerProvider.class);
property(ServerProperties.METAINF_SERVICES_LOOKUP_DISABLE, true);
}
}